package control;

import java.util.ArrayList;
import model.Bunke;
import model.Deck;
import model.Kort;
import model.Spiller;
import model.Suit;
import view.MainGui;
import static view.MainGui.main;

/**
 *
 * @author Jeppe
 */
public class Spil1 {

    private String navn;
    private MainGui mainGui;
    private Deck deck;
    private Bunke bunke;
    private int runde;
    private int spilStatus;
    private boolean winner;
    private Spiller startSpiller;
    private ArrayList<Spiller> spillerList;
    Spiller forrigeSpiller = new Spiller("forrige"); //"forrige" bruger vi til at anbringe det kort som man vælger at lægge ned i bunken. anvendes kun i runner-metoderne.
    private Suit curSuit;
    private int curNumber;
    private int antalToere;

    public Spil1(String navn, MainGui mainGui) {
        this.mainGui = mainGui;
        this.navn = navn;
        runde = 0;
        spillerList = new ArrayList<>();
        //Opretter deck
        deck = new Deck(1, true);
        //Opretter bunke
        bunke = new Bunke("Bunken");
        spilStatus = 1;
    }

    public void nytSpil() {
        int numDecks = 1;
        if (spillerList.size() >= 5) {
            numDecks++;
        }
        deck = new Deck(numDecks, true);

        givAlle7Kort();
        //Opretter bunke
        bunke = new Bunke("Bunken");
        bunke.vendKort(deck.trækØversteKort());
        curSuit = bunke.getØversteKort().getSuit();
    }

    public Suit getCurSuit() {
        return curSuit;
    }

    public void setCurSuit(Suit curSuit) {
        this.curSuit = curSuit;
    }

    public Bunke getBunke() {
        return bunke;
    }

    public int getSpilStatus() {
        return spilStatus;
    }

    /**
     * Metoden kaldes med den integer som man vil lægge til spilStatus
     *
     * @param spilStatus hvor mange man vil add'e med. af datatypen int.
     */
    public void addSpilStatus(int spilStatus) {
        this.spilStatus = this.spilStatus + 1;
    }

    public void setSpilStatus(int spilStatus) {
        this.spilStatus = spilStatus;
    }

    public void addSpiller(Spiller spiller) {
        spillerList.add(spiller);
    }

    public Spiller getAktivSpiller() {
        return spillerList.get(0);
    }

    public void givAlle7Kort() {
        for (int i = 0; i < spillerList.size(); i++) {
            trækKortOp(spillerList.get(i), 7);
        }
    }

    /**
     * Giver en valgt spiller et valgt antal kort op.
     *
     * @param Spiller = spiller navnet ex: (Spiller1)
     * @param antalKortOp = et antal kort op med datatypen int. ex: (7)
     */
    public void trækKortOp(Spiller spiller, int antalKortOp) {
        for (int i = 1; i <= antalKortOp; i++) {
            if (deck.getAntalKortIDeck() == 0) {
                System.out.println("Vender bunke");
                Spiller midl = new Spiller("midl");
                midl.tilføjKort(bunke.getØversteKort());
                bunke.fjernEtEnkelt(bunke.getAntalKortIBunke() - 1);
                bunke.vendBunke();
                for (int j = 0; j < bunke.getAntalKortIBunke() - 1; j++) {
                    deck.fjernKortFraBunke(bunke.getKort(j));
                    bunke.fjernEtEnkelt(j);
                }
                bunke.vendKort(midl.lægKortNed(0));
            }
            int index = 0;
            while (!spillerList.get(index).equals(spiller)) {
                index++;
            }
            spillerList.get(index).tilføjKort(deck.trækØversteKort());
        }
        //Debug print-out
        System.out.println(spiller.getNavn() + " trækker " + antalKortOp + " kort op.");
    }

    /**
     * Har den valgte spiller vundet?
     *
     * @return true hvis personen har vundet og false hvis ikke. Vundet betyder
     * at personen ikke har flere kort på hånden.
     */
    public boolean activePlayerHasWon() {
        if (spillerList.get(0).antalKortPåHånd() == 0) {
            winner = true;
        }
        return winner;
    }

    private boolean spar5() {
        Kort comparableCard = bunke.getØversteKort();
        boolean spar5 = false;
        if (comparableCard.getSuit().toString().equals("Spar") && comparableCard.getNumber() == 5) {
            spar5 = true;
        }
        return spar5;
    }

    private boolean måManLæggeDenneNed(Kort kort) {
        Kort comparableCard = bunke.getØversteKort();

        boolean legal = false;
        if (antalToere == 0) {
            if (runde == 0 && curNumber == 8 || runde == 0 && curSuit.toString().equalsIgnoreCase("Hjerter") && comparableCard.getNumber() == 13) {
                legal = true;
            } else if (comparableCard.getSuit().toString().equals(kort.getSuit().toString()) || comparableCard.getNumber() == kort.getNumber()) {
                legal = true;
            } else if (kort.getNumber() == 8) {
                legal = true;
                System.out.println("Det er en 8'er der er blevet  lagt.");
            }
        } else {
            if (kort.getNumber() == 2) {
                legal = true;
            }
        }
        return legal;
    }

    /**
     * Har ansvar for at lægge det kort ned spilleren ønsker og skifte til næste
     * spiller
     *
     * @param kort
     * @return
     */
    public boolean lægEtKortned(Kort kort) {
        boolean legal = false;
        if (måManLæggeDenneNed(kort)) {
            legal = true;
            for (int i = 0; i < spillerList.get(0).getHånd().size(); i++) {
                if (spillerList.get(0).getHånd().get(i).equals(kort)) {
                    bunke.trækKortFraSpiller(spillerList.get(0).lægKortNed(i));
                    if (kort.getSuit().toString().equals("Spar") && kort.getNumber() == 5) {
                        skiftSpiller();
                        trækKortOp(spillerList.get(0), 5);
                        skiftSpiller();
                    } else if (kort.getNumber() == 2) {
                        skiftSpiller();
                        boolean harEnToer = false;
                        antalToere++;
                        for (int j = 0; j < spillerList.get(0).getHånd().size(); j++) {
                            if (spillerList.get(0).getHånd().get(j).getNumber() == 2) {
                                harEnToer = true;
                            }
                        }
                        if (!harEnToer) {
                            for (int j = 0; j < antalToere; j++) {
                                spillerList.get(0).tilføjKort(deck.trækØversteKort());
                                spillerList.get(0).tilføjKort(deck.trækØversteKort());
                            }
                            antalToere = 0;
                        }
                    } else if (kort.getSuit().toString().equals("Hjerter") && kort.getNumber() == 13) {
                        System.out.println("Det skulle være spillerens tur igen pga. Hjerter Konge er blevet lagt");
                    } else if (kort.getNumber() == 8) {
                        mainGui.visKulørVælger();
                        skiftSpiller();
                    }
                }
            }

        } else {
            System.out.println("Man må ikke lægge " + kort.toString() + " ned på " + bunke.getØversteKort().toString());
        }
        return legal;
    }

    @Deprecated
    public void flytIArray(Kort[] arr, int pos) {
//        Kort sidste = arr[arr.length];
//
//        System.arraycopy(arr, pos, arr, pos + 1, arr.length - pos - 1);
//
//        arr[pos] = sidste;
    }

    @Deprecated
    public int nytSpilEllerQuit() {
        int i = 0;
//        String input;
//        
//        while (i == 0) {
//            System.out.println("        Skriv q igen for at lukke programmet\n        Skriv n for at starte et nyt spil ");
//            input = scan.nextLine();
//            if (input.equals("q") || input.equals("n")) {
//                if (input.equals("q")) {
//                    System.out.println("Du har valgt at lukke programmet\n Lukker...");
//                    try {
//                        Thread.sleep(1000);
//                    } catch (InterruptedException ex) {
//                        Thread.currentThread().interrupt();
//                    }
//                    System.err.println("GAME OVER");
//                    System.exit(0);
//                } else {
//                    i = 3;
//                }
//            }
//            i++;
//        }
        return i;
    }

    /**
     * Tilføjer spillere vha. arrays. Skal ikke kaldes med noget.
     */
    @Deprecated
    public void tilføjSpiller() {

//        //String playerCountStr;
//        int antalOpretSpillere;
//        String playerCountStr = "Ugyldig";
//        int antalKort = 7; //TEST!
//
//        // --- Opret spillere ---
//        // Får oplyst antal spillere, så vi kan oprette dem i spillet
//        // Sætter maks og min for hvor mange spillere der kan være med
//        while (!playerCountStr.matches("\\d+")) {
//            System.out.println("Indtast antal spillere");
//            playerCountStr = scan.nextLine();
//        }
//        antalSpillere = Integer.parseInt(playerCountStr);
//        antalOpretSpillere = antalSpillere - 1; // Sætter denne variabel lig med antalSpiller-1 da for-løkken længere nede starter på 0.
//
//        if (antalSpillere <= 1) {
//            System.out.println("Man skal mindst være 2 spillere for at spille Olsen");
//            spilStatus = 0;
//        } else if (antalSpillere >= 5) {
//            System.out.println("Der må desværre ikke være mere en 4 spillere med. \n Resten må vente til næste spil.");
//            spilStatus = 0;
//        } else {
//            System.out.println("Du har valg at oprette " + antalSpillere + " spillere.");
//
//            //Opret et array til at holde spillernes navne
//            String[] navnSpiller;
//            navnSpiller = new String[antalSpillere];
//
//            //Kører en løkke for hver spiller
//            //Løkken beder brugeren indtaste navn for hver spiller
//            //og gemmer svarene i array'et "playerNames".
//            for (int i = 0; i <= antalOpretSpillere; i++) {
//                System.out.println("Hvad er navnet på spiller " + (i + 1));
//                navnSpiller[i] = scan.nextLine();
//            }
//
//            //Opret et array der kan holde spiller-objekterne
//            spillerArray = new Spiller[antalSpillere];
//            //System.out.println("Array oprettet");
//            //Opret en løkke der instantierer hvert spiller-objekt med navnet pÃ¥ en spiller.        
//            for (int i = 0; i <= antalOpretSpillere; i++) {
//
//                spillerArray[i] = new Spiller(navnSpiller[i]);
//                givKort(i, antalKort);
//
//            }
//            bunke1.vendKort(deck1.trækNæsteKort());
//        }
    }

    public void vendFjernBlandOgGivKortIgen() {
        for (int i = 0; i < spillerList.size(); i++) { // Fjerner kort fra alle hænder
            for (int j = 1; j < spillerList.get(i).antalKortPåHånd() + 1; j++) {

            }
        }
        bunke.vendBunke();
        for (int i = 0; i < bunke.getAntalKortIBunke(); i++) { // Lægger alle kort fra bunken over i decket.
            deck.fjernKortFraBunke(bunke.getØversteKort());
        }
        bunke.tømBunke();
        deck.shuffle(5);
        for (int i = 0; i < spillerList.size(); i++) { //giver kort på ny
            trækKortOp(spillerList.get(i), 7); //TEST           
        }
        bunke.vendKort(deck.trækØversteKort());
        System.out.println("Der gives kort");
    }

    /**
     * Metode der tæller og skriver point til alle oprettede spillere.
     *
     */
    public void tælOgSkrivPoint() {
        System.out.println("\nNuværende point-status:");
        for (int i = 0; i < spillerList.size(); i++) {
            spillerList.get(i).addPoint(spillerList.get(i).getHåndSum());
            System.out.println(spillerList.get(i).getNavn() + " har " + spillerList.get(i).getPoint() + " point");
            spillerList.get(i).udskrivHånd(true);
        }
    }

    public void skiftSpiller() {
        System.out.println("Skifter start-spiller");
        spillerList.add(spillerList.remove(0));
        System.out.println(spillerList.get(0).getNavn() + "'s tur.");
    }

    private void setStartSpiller(Spiller spiller) {
        while (!spillerList.get(0).equals(spiller)) {
            skiftSpiller();
        }
    }

    @Deprecated
    private void metodeLægNed(Spiller spiller, Kort kortNed) {
        if (forrigeSpiller.getHånd().size() >= 1) {
            forrigeSpiller.getHånd().remove(0);
        }
//        forrigeSpiller.getHånd().add(0, spillerArray[spillerAktiv].getKort(kortNed));
//        bunke1.trækKortFraSpiller(spillerArray[spillerAktiv].lægKortNed(kortNed));
//        tjekVinder(spillerAktiv);
    }

    /**
     * Regler spørger spilleren hvad han/hun vil gøre. og lægger kort ned.
     *
     * @param antalToere skal angives for at man kan regne ud hvor mange kort en
     * spiller skal have op hvis der ligger en toer i forvejen.
     * @param i hvilken spiller der er aktiv.
     * @param kortNumB Hvilket nummer det kort har som ligger øverst i bunken.
     * @param kulørB Hvilken kulør det kort har som ligger øverst i bunken.
     */
    @Deprecated
    private void regler(int antalToere, int i, int kortNumB, String kulørB) {
        String input = "ingenting";
        int kortNed;
//        if (runde == 0 && curKortNum == 8 || runde == 0 && curKulør.equalsIgnoreCase("Hjerter") && curKortNum == 13) {
//            System.out.println(spillerArray[aktiv].getNavn() + " starter. Du må selv vælge hvad du vil lægge ned.");
//            input = "ingenting";
//            while (!input.equalsIgnoreCase("a")) {
//                System.out.println("Skriv a for at fortælle at det kun er dig der kan se skærmen.");
//                input = scan.nextLine();
//            }
//            spillerArray[aktiv].udskrivHånd(true);
//            input = "ingenting";
//            while (!input.matches("\\d+")) {
//                System.out.println("Hvilket kort vil du lægge ned? (Svar med det tal der er ud for kortet)");
//                input = scan.nextLine();
//            }
//            int ekstra = Integer.parseInt(input);
//            metodeLægNed(i, ekstra);
//            i++;
//        } else if (curKortNum == 5 && curKulør.equals("Spar")) { // Hvis Spar 5 ligger øverst.            
//            givKort(i, 5);
//            i++;
//        } else {
//            System.out.println(spillerArray[aktiv].getNavn() + "'s tur. Skriv a for at fortælle at det kun er dig der kan se skærmen.");
//            input = scan.nextLine();
//
//            //if sætningen sikrer sig at medmindre spilleren trykker "a" vil man blot blive bedt om det igen.
//            if (input.equalsIgnoreCase("a")) {
//                do {
//                    System.out.println("Du skal bekende kulør med en " + curKulør + " eller en " + curKortNum + "'er");
//                    spillerArray[aktiv].udskrivHånd(true);
//
//                    System.out.println("Hvilket kort vil du lægge ned? (Svar med det tal der er ud for kortet)\n"
//                            + "Hvis du derimod vil trække et kort op skriv 0");
//
//                    input = scan.nextLine();
//                    if (input.matches("\\d+")) {
//                        kortNed = Integer.parseInt(input);
//
//                        if (kortNed == 0) { //Hvis spilleren har valgt at trække et kort op.
//                            if (kortNumB == 2) { //Hvis der er lagt en 2'er i bunken.
//                                antalToere++;
//                                givKort(i, (2 * antalToere));
//                                System.out.println(spillerArray[aktiv].getNavn() + " trækker " + (2 * antalToere) + "kort op");
//                                antalToere = 0;
//                                i++;
//                            } else {
//                                givKort(i, 1);
//                                i++;
//                            }
//                        } else if (kortNed > 0) {
//                            if (kortNed > spillerArray[aktiv].antalKortPåHånd() + 1) {
//                            }
//                            kulørH = spillerArray[aktiv].getKort(kortNed).getSuit().toString();
//                            kortNumH = spillerArray[aktiv].getKort(kortNed).getNumber();
//                            System.out.println("Du har valgt at lægge: " + kulørH + " " + kortNumH + " ned");
//                            if (kortNumB == 1 && kortNumH == 1) { //Hvis bunkens øverste kort er et Es                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kortNumB == 2) { //Hvis bunkens øverste kort er en 2'er.
//                                antalToere++;
//                                if (spillerArray[aktiv].lægKortNed(kortNed).getNumber() == 2) {
//                                    antalToere++;
//                                    metodeLægNed(i, kortNed);
//                                    i++;
//                                } else {
//                                    i--;
//                                    System.out.println("Det kan du desværre ikke.");
//                                }
//                            } else if (kortNumB == 3 && kortNumH == 3) { //Hvis bunkens øverste kort er en 3'er.                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kortNumB == 4 && kortNumH == 4) { //Hvis bunkens øverste kort er en 4'er.                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kortNumB == 5 && kortNumH == 5) { //Hvis bunkens øverste kort er en 5'er.                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kortNumB == 6 && kortNumH == 6) { //Hvis bunkens øverste kort er en 6'er.                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kortNumB == 7 && kortNumH == 7) { //Hvis bunkens øverste kort er en 7'er.                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kortNumH == 8) {                  //Hvis spiller vælger at lægge en 8'er.                            
//                                metodeLægNed(i, kortNed);
//                                System.out.println("Hvilken kulør vil du skifte til?");
//                                while (!input.equalsIgnoreCase("Hjerter") && !input.equalsIgnoreCase("Spar") && !input.equalsIgnoreCase("Ruder") && !input.equalsIgnoreCase("Klør")) {
//                                    input = scan.nextLine();
//                                    if (input.equalsIgnoreCase("Spar")) {
//                                        curKulør = "Spar";
//                                    } else if (input.equalsIgnoreCase("Klør")) {
//                                        curKulør = "Klør";
//                                    } else if (input.equalsIgnoreCase("Ruder")) {
//                                        curKulør = "Ruder";
//                                    } else if (input.equalsIgnoreCase("Hjerter")) {
//                                        curKulør = "Hjerter";
//                                    }
//                                }
//                                i++;
//                            } else if (kortNumB == 9 && kortNumH == 9) { //Hvis bunkens øverste kort er en 9'er.                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kortNumB == 10 && kortNumH == 10) { //Hvis bunkens øverste kort er en 10'er.                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kortNumB == 11 && kortNumH == 11) { //Hvis bunkens øverste kort er en Knægt.                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kortNumB == 12 && kortNumH == 12) { //Hvis bunkens øverste kort er en Dame.                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kortNumB == 13 && kortNumH == 13) { //Hvis bunkens øverste kort er en Konge.                            
//                                if (kulørH.equals("Hjerter")) {
//                                    metodeLægNed(i, kortNed);
//                                    spillerArray[aktiv].udskrivHånd(true);
//                                    System.out.println("Hvilket kort vil du lægge ned oven på Hjerter Konge?(Svar med det tal der er ud for kortet)");
//                                    input = "ingenting";
//                                    while (!input.matches("\\d")) {
//                                        input = scan.nextLine();
//                                    }
//                                    int ekstra = Integer.parseInt(input);
//                                    metodeLægNed(i, ekstra);
//                                } else {
//                                    metodeLægNed(i, kortNed);
//                                }
//                                i++;
//                            } else if (kulørB.equalsIgnoreCase("Hjerter") && kulørH.equals("Hjerter")) { //Hvis bunkens øverste kort er af kuløren "Hjerter".        *                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kulørB.equalsIgnoreCase("Spar") && kulørH.equals("Spar")) { //Hvis bunkens øverste kort er af kuløren "Spar".        *                           
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kulørB.equalsIgnoreCase("Klør") && kulørH.equals("Klør")) { //Hvis bunkens øverste kort er af kuløren "Klør".        *                           
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else if (kulørB.equalsIgnoreCase("Ruder") && kulørH.equals("Ruder")) { //Hvis bunkens øverste kort er af kuløren "Ruder".        *                            
//                                metodeLægNed(i, kortNed);
//                                i++;
//                            } else {
//                                System.out.print("Du kan altså ikke lægge " + spillerArray[i].getKort(kortNed).toString(true) + " ned, når du skal lægge en " + curKulør + " ned. ");
//                                i--; //spørger spiller igen hvad det egentlig er han vil.
//                            }
//                            if (kortNumH == 8) {
//                                System.out.println("Hvilken kulør vil du skifte til?");
//                                while (!input.equalsIgnoreCase("Hjerter") && !input.equalsIgnoreCase("Spar") && !input.equalsIgnoreCase("Ruder") && !input.equalsIgnoreCase("Klør")) {
//                                    input = scan.nextLine();
//                                    if (input.equalsIgnoreCase("Spar")) {
//                                        curKulør = "Spar";
//                                    } else if (input.equalsIgnoreCase("Klør")) {
//                                        curKulør = "Klør";
//                                    } else if (input.equalsIgnoreCase("Ruder")) {
//                                        curKulør = "Ruder";
//                                    } else if (input.equalsIgnoreCase("Hjerter")) {
//                                        curKulør = "Hjerter";
//                                    }
//                                }
//                            }
//                            if (winner) {
//                                i = antalSpillere + 1;
//                            }
//                            runde = runde + 1;
//
//                        } else {
//                            i--;
//                        }
//
//                        if (winner) {
//                            i = antalSpillere + 2;
//                        }
//
//                    } else if (input.equalsIgnoreCase("q")) {
//                        System.out.println(spillerArray[aktiv].getNavn() + " afsluttede spillet");
//                        // ----- Gør så main-klassen kalder nytSpilEllerQuit ----- 
//                        spilStatus = -1;
//                        i = antalSpillere + 1;
//                    } else {
//                        i--; //Hvis man ikke har tastet en integer eller q ind.
//                    }
//                    if (i - aktiv > 1) {
//                        System.out.println("Der er noget galt med (i)!!!!!");
//                    }
//                } while (i - aktiv == 1);
//                aktiv++;
//            } else if (input.equalsIgnoreCase("q")) {
//                System.out.println(spillerArray[aktiv].getNavn() + " afsluttede spillet");
//                // ----- Gør så main-klassen kalder nytSpilEllerQuit ----- 
//                spilStatus = -1;
//                i = antalSpillere + 1;
//            } else {
//                i--; //Hvis man hverken har tastet "a", "0","et tal inden for det antal kort man har på hånden" eller "q".
//            }
//            if (runde >= 1) {
//                curKulør = forrigeSpiller.getHånd().get(0).getSuit().toString();
//                curKortNum = forrigeSpiller.getHånd().get(0).getNumber();
//            } else {
//                runde = 0;
//            }
//        }
    }
}
